#pragma once
#include "cybertron/DefinesCore.hpp"
#include "cybertron/glm/vec2.hpp"
#include "cybertron/glm/vec3.hpp"
#include <random>
#include <vector>

CYBERTRON_BEGIN

enum NoiseType {
	EWhiteNoise,
	EBiasNoise,
	ELinearTimeNoise,
	EPeriodicTimeNoise,
	EPinkNoise,
	EBrownNoise,
	ECompositeNoise
};

class NoiseBase
{
public:
	NoiseBase(NoiseType noiseType);
	virtual ~NoiseBase();
	inline NoiseType noiseType() const { return m_noiseType; }
	inline float value() const { return m_value.x; }
	inline vec2 value2d() const { return vec2(m_value.x, m_value.y); }
	inline vec3 value3d() const { return m_value; }

	virtual vec3 update() = 0;

	virtual void setNoise(const vec3& value);
	virtual void resetNoise();

	static std::mt19937& randomEngine();

protected:
	NoiseType	m_noiseType;
	vec3		m_value;
};

typedef std::shared_ptr<NoiseBase> NoiseBasePtr;
typedef std::vector<NoiseBasePtr> NoiseBases;

CYBERTRON_END